#include "tablero.h"
#include <iostream>
using namespace std;

#define VWP_HRES 1024
#define VWP_VRES 768
#define COLOR_PROF 32
#define TABLERO_MIN_ANCHO (1024 / 4)
#define TABLERO_MIN_ALTURA (768 / 4)

namespace ui {
namespace tablero {

Tablero::Tablero(const Glib::RefPtr<const Gdk::GL::Config> &p_Config) :
	Gtk::GL::DrawingArea(p_Config),
	m_bSalir(false),
	m_Ciudades(this->m_TexturaDeFondo),
	m_MapaEsferico(this->m_TexturaDeFondo, this->m_Ciudades),
	m_MapaPlano(this->m_TexturaDeFondo, this->m_Ciudades),
	m_pMapa(&this->m_MapaEsferico),
	m_eTipoMapa(MAPA_ESFERICO) {

	this->add_events(Gdk::BUTTON_PRESS_MASK);
	this->set_size_request(TABLERO_MIN_ANCHO, TABLERO_MIN_ALTURA);
}

Tablero::~Tablero() {
}

void Tablero::on_realize() {

	static bool t_bPrimeraVez = true;

	Gtk::GL::DrawingArea::on_realize();
	Glib::RefPtr<Gdk::GL::Window> t_Window = get_gl_window();

	if (!t_Window->gl_begin(get_gl_context())) {
    	return;
	}

 	if (t_bPrimeraVez) {
		this->m_TexturaDeFondo.bCargar("earth.bmp");
		this->m_Ciudades.cargar();
		t_bPrimeraVez = false;
	}

	t_Window->gl_end();
}

bool Tablero::on_configure_event(GdkEventConfigure *event) {

	Glib::RefPtr<Gdk::GL::Window> t_Window = get_gl_window();

	if (!t_Window->gl_begin(get_gl_context())) {
		return false;
	}

	glViewport(0, 0, this->get_width(), this->get_height());
	this->m_pMapa->actualizarPerspectiva(this->get_width(), this->get_height());

	t_Window->gl_end();
	return true;
}

bool Tablero::on_expose_event(GdkEventExpose *event) {

	Glib::RefPtr<Gdk::GL::Window> t_Window = get_gl_window();

	if (!t_Window->gl_begin(get_gl_context())) {
		return false;
	}

	this->m_pMapa->actualizarCamara();

	if (t_Window->is_double_buffered()) {
		t_Window->swap_buffers();
	} else {
		glFlush();
	}

	t_Window->gl_end();
	return true;
}

void Tablero::cambiarMapa(tipo_mapa_e p_eTipoMapa) {

	bool t_bCambioMapa = false;

	switch (p_eTipoMapa) {
		case MAPA_ESFERICO:
			if (this->m_eTipoMapa != MAPA_ESFERICO) {
				this->m_pMapa = &this->m_MapaEsferico;
				this->m_eTipoMapa = MAPA_ESFERICO;
				t_bCambioMapa = true;
			}
			break;
		case MAPA_PLANO:
			if (this->m_eTipoMapa != MAPA_PLANO) {
				this->m_pMapa = &this->m_MapaPlano;
				this->m_eTipoMapa = MAPA_PLANO;
				t_bCambioMapa = true;
			}
			break;
	}

	if (t_bCambioMapa) {
		this->m_pMapa->actualizarPerspectiva(this->get_width(), this->get_height());
		this->invalidate();
	}
}

IMapa *Tablero::getMapa() {
	return this->m_pMapa;
}

tipo_mapa_e Tablero::get_tipo_mapa(){
	return m_eTipoMapa;
}

void Tablero::invalidate() {
	this->get_window()->invalidate_rect(get_allocation(), true);
}

bool Tablero::on_button_press_event(GdkEventButton *event) {

    if (event->button == 1) {
		this->m_pMapa->actualizarSeleccion(
			static_cast<int>(event->x), static_cast<int>(event->y));
		this->invalidate();
	}
}

bool Tablero :: on_key_press_event(GdkEventKey *event){
	mover_camara_e t_MoverCamara;
	bool t_b = true;

	switch (event->keyval) {
		case GDK_Page_Down:
			t_MoverCamara = MOVER_CAMARA_ATRAS; break;
		case GDK_Page_Up:
			t_MoverCamara = MOVER_CAMARA_ADELANTE; break;
		case GDK_Up:
			t_MoverCamara = MOVER_CAMARA_ARRIBA; break;
		case GDK_Down:
			t_MoverCamara = MOVER_CAMARA_ABAJO; break;
		case GDK_Left:
			t_MoverCamara = MOVER_CAMARA_IZQUIERDA; break;
		case GDK_Right:
			t_MoverCamara = MOVER_CAMARA_DERECHA; break;
		default: 
			t_b = false; 
			break;
	}

	for (int i = 0; i < MOVS_POR_ANGULO; i++) {
		this->getMapa()->moverCamara(t_MoverCamara);
		this->invalidate();
	}
	
	return t_b;
}

}

}
